package com.smartleanx.module.hrm.service.payroll;

import com.smartleanx.framework.common.pojo.PageResult;
import com.smartleanx.framework.common.validation.InEnum;
import com.smartleanx.module.bpm.enums.task.BpmProcessInstanceStatusEnum;
import com.smartleanx.module.hrm.controller.admin.payroll.vo.PayrollDetailCommonReqVO;
import com.smartleanx.module.hrm.controller.admin.payroll.vo.PayrollDetailPageReqVO;
import com.smartleanx.module.hrm.controller.admin.payroll.vo.PayrollDetailSaveReqVO;
import com.smartleanx.module.hrm.dal.dataobject.payroll.PayrollDetailDO;
import com.smartleanx.module.hrm.service.payroll.bo.PayrollDetailFieldSaveBO;

import javax.validation.Valid;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.List;

/**
 * 薪资详情 Service 接口
 *
 * @author zhangchp
 */
public interface PayrollDetailService {

    /**
     * 创建薪资详情
     *
     * @param createBOs 创建信息
     * @param payrollId 薪资月编号
     * @return 编号
     */
    PayrollDetailDO createDetail(@Valid Collection<PayrollDetailFieldSaveBO> createBOs, @NotNull(message = "薪资月编号不能为空") Long payrollId);

    /**
     * 更新薪资详情
     *
     * @param updateReqVO 更新信息
     */
    void updateDetail(@Valid PayrollDetailSaveReqVO updateReqVO);

    /**
     * 审批
     * @param reqVO 查询条件
     */
    void approve(@Valid PayrollDetailCommonReqVO reqVO);
    /**
     * 更新审批结果
     * @param ids ID列表
     * @param approveResult 审批结果
     */
    void updateApproveResult(@Valid @NotEmpty(message = "ID列表不能为空") Collection<Long> ids,
                             @NotNull(message = "审批结果不能为空") @InEnum(value = BpmProcessInstanceStatusEnum.class, message = "审核结果格式非法") Integer approveResult);

    /**
     * 生成工资条
     * @param reqVO 查询条件
     */
    void generatePayStub(@Valid PayrollDetailCommonReqVO reqVO);

    /**
     * 发送工资条
     * @param reqVO 薪资记录
     */
    void sendPayStub(@Valid PayrollDetailCommonReqVO reqVO);

    /**
     * 撤回工资条
     * @param reqVO 薪资记录
     */
    void withdrawPayStub(@Valid PayrollDetailCommonReqVO reqVO);
    /**
     * 更新已读状态
     * @param id ID
     */
    void updateReadStatus(@Valid @NotNull(message = "ID不能为空") Long id);

    /**
     * 更新确认状态
     * @param id ID
     * @param confirmStatus 确认状态
     * @param feedback 反馈
     */
    void updateConfirmStatus(@Valid @NotNull(message = "ID不能为空") Long id, @NotNull(message = "确认状态不能为空") Boolean confirmStatus, String feedback);

    /**
     * 确认工资条
     * @param reqVO 薪资记录
     */
    void confirmPayStub(@Valid PayrollDetailCommonReqVO reqVO);

    /**
     * 取消确认工资条
     * @param reqVO 薪资记录
     */
    void cancelPayStub(@Valid PayrollDetailCommonReqVO reqVO);

    /**
     * 归档
     * @param payrollId 薪资月份ID
     */
    void archive(Long payrollId);

    /**
     * 删除薪资详情
     *
     * @param id 编号
     */
    void deleteDetail(Long id);

    /**
     * 获得薪资详情列表
     * @param id ID
     * @return
     */
    PayrollDetailDO getDetail(Long id);

    /**
     * 获得薪资详情列表
     * @param payrollId 薪资月份ID
     * @return
     */
    List<PayrollDetailDO> getDetailListByPayrollId(Long payrollId);

    /**
     * 获得薪资详情列表
     * @param payrollId 薪资月份ID
     * @param employeeId 员工ID
     * @return
     */
    List<PayrollDetailDO> getDetailListByPayrollIdAndEmployeeId(Long payrollId,Long employeeId);

    /**
     * 获得薪资详情分页
     *
     * @param pageReqVO 分页查询
     * @return 薪资详情分页
     */
    PageResult<PayrollDetailDO> getDetailPage(PayrollDetailPageReqVO pageReqVO);
}